package 力扣算法练习.main1.part1;

public class day8 {
    public static class ListNode {
        int val;
        ListNode next;
        ListNode() {
        }
        ListNode(int val) {
            this.val = val;
        }
        ListNode(int val, ListNode next) {
            this.val = val;
            this.next = next;
        }
    }

    /*
    给你一个链表数组，每个链表都已经按升序排列。
    请你将所有链表合并到一个升序链表中，返回合并后的链表。
    https://leetcode.cn/problems/merge-k-sorted-lists/
     */
    //要考虑的参数很多所以出了很多次错
    public static ListNode mergeKLists(ListNode[] lists) {
        if (lists.length == 0) return null;
        //遍历每一个链表的每一个元素找最小的然后添加到链表
        ListNode head = new ListNode(), temp = head, cur;
        int count = 0;//记录是不是每一个链表都遍历完了
        int index, t;//t用于记录cur是哪个索引的链表
        int numser = 0;
        while (count < lists.length) {
            cur = null;
            t = -1;
            count = 0;
            index = 0;
            while (index < lists.length) {
                if (lists[index] == null) {
                    count++;
                    index++;
                    continue;
                }
                if (cur == null) {
                    cur = lists[index];
                    t = index;
                } else if (cur.val > lists[index].val) {
                    cur = lists[index];
                    t = index;
                }
                index++;
            }
            if (count == lists.length) break;
            temp.next = cur;
            temp = temp.next;
            lists[t] = lists[t].next;
            numser++;
        }
        return head.next;
    }


    /*
    给你一个链表，两两交换其中相邻的节点，并返回交换后链表的头节点。
    你必须在不修改节点内部的值的情况下完成本题（即，只能进行节点交换）。
    https://leetcode.cn/problems/swap-nodes-in-pairs/
     */
    public ListNode swapPairs(ListNode head) {
        if (head == null) return null;
        //定义四个节点记录四个位置
        ListNode result = new ListNode();
        result.next = head;
        ListNode parent = result, front=result, after = result, last = head,temp;
        int n = 0;
        while (last != null) {
            parent=front;
            front=after;
            after = last;
            last=last.next;
            if (++n==2){
                after.next=front;
                parent.next=after;
                front.next=null;
                temp=front;
                front=after;
                after=temp;
                n=0;
            }
        }
        if (n==1)front.next=after;//奇数节点还剩一个节点
        return result.next;
    }
}

